(*
This document can not be used as a script in "CE Scripter",
this document is only for documentation purpose.

It shows you ALL avalible types that you can change in CE Scripter.
*)

{
type
TContent = packed record
e: array [0..Pred(3),0..Pred(3)] of integer;
end;
TContentArr = array [0..Pred(MAX_ELEMENT_CONTENTS)] of TContent;
PContentArr = ^TContentArr;
EnvelopeInfo = packed record
xsize: integer;
ysize: integer;
text: array [0..Pred(MAX_ENVELOPE_TEXT_LEN+1)] of char;
end;
pLevelFileInfo = ^LevelFileInfo;
LevelFileInfo = packed record
nr: integer; 
typea: integer;
packeda: boolean;
basename: pchar;
filename: pchar;
end;
DateInfo = packed record
year: integer; 
month: integer; 
day: integer; 
end;
pLevelInfo = ^LevelInfo;
LevelInfo = packed record
file_info: LevelFileInfo; 
game_engine_type: integer; (* level stored in native format for the alternative native game engines *)
//native_em_level: pLevelInfo_EM; ***ZZZ*** skipped
file_version: integer; (* file format version the level is stored with    *)
game_version: integer; (* game release version the level was created with *)
creation_date: DateInfo; 
encoding_16bit_field: boolean; (* level contains 16-bit elements  *)
encoding_16bit_yamyam: boolean; (* yamyam contains 16-bit elements *)
encoding_16bit_amoeba: boolean; (* amoeba contains 16-bit elements *)
fieldx: integer; 
fieldy: integer; 
time: integer; (* available time (seconds) *)
gems_needed: integer; 
name: array [0..Pred(MAX_LEVEL_NAME_LEN+1)] of char;
author: array [0..Pred(MAX_LEVEL_AUTHOR_LEN+1)] of char;
envelope: array [0..Pred(NUM_ENVELOPES)] of EnvelopeInfo;
score: array [0..Pred(LEVEL_SCORE_ELEMENTS)] of integer;
yamyam_content: TContentArr;
num_yamyam_contents: integer; 
amoeba_speed: integer; 
amoeba_content: integer; 
game_of_life: array [0..Pred(4)] of integer; 
biomaze: array [0..Pred(4)] of integer; 
time_magic_wall: integer; 
time_wheel: integer; 
time_light: integer; 
time_timegate: integer; 
shield_normal_time: integer; 
shield_deadly_time: integer; 
extra_time: integer; 
time_orb_time: integer; 
extra_time_score: integer; 
start_element: array [0..Pred(MAX_PLAYERS)] of integer; 
use_start_element: array [0..Pred(MAX_PLAYERS)] of boolean; 
artwork_element: array [0..Pred(MAX_PLAYERS)] of integer; 
use_artwork_element: array [0..Pred(MAX_PLAYERS)] of boolean; 
explosion_element: array [0..Pred(MAX_PLAYERS)] of integer; 
use_explosion_element: array [0..Pred(MAX_PLAYERS)] of boolean;
(* values for the new EMC elements *)
android_move_time: integer;
android_clone_time: integer;
ball_random: boolean;
ball_state_initial: boolean;
ball_time: integer;
lenses_score: integer;
magnify_score: integer;
slurp_score: integer;
lenses_time: integer;
magnify_time: integer;
wind_direction_initial: integer;
ball_content: TContentArr;
num_ball_contents: integer;
num_android_clone_elements: integer;
android_clone_element: array [0..Pred(MAX_ANDROID_ELEMENTS)] of integer;
can_move_into_acid_bits: integer; (* bitfield to store property for elements *)
dont_collide_with_bits: integer; (* bitfield to store property for elements *)
initial_player_stepsize: array [0..Pred(MAX_PLAYERS)] of integer; (* initial player speed *)
initial_player_gravity: array [0..Pred(MAX_PLAYERS)] of boolean; 
em_slippery_gems: boolean; (* EM style "gems slip from wall" behaviour *)
use_spring_bug: boolean; (* for compatibility with old levels *)
use_time_orb_bug: boolean; (* for compatibility with old levels *)
instant_relocation: boolean; (* no visual delay when relocating player *)
can_pass_to_walkable: boolean; (* player can pass to empty or walkable tile *)
grow_into_diggable: boolean; (* amoeba can grow into anything diggable *)
continuous_snapping: boolean; (* repeated snapping without releasing key *)
block_snap_field: boolean; (* snapping blocks field to show animation *)
block_last_field: boolean; (* player blocks previous field while moving *)
sp_block_last_field: boolean; (* player blocks previous field while moving *)
(* ('int' instead of 'boolean' because used as selectbox value in editor) *)
use_step_counter: integer; (* count steps instead of seconds for level *)
field: array [0..Pred(MAX_LEV_FIELDX)] of array [0..Pred(MAX_LEV_FIELDY)] of word;
use_custom_template: boolean; (* use custom properties from template file *)
no_valid_file: boolean; (* set when level file missing or invalid *)
changed: boolean; (* set when level was changed in the editor *)
end;
ElementChangeInfo = packed record
can_change: boolean; (* use or ignore this change info *)
has_event: array [0..Pred(NUM_CHANGE_EVENTS)] of boolean; (* change events *)
trigger_player: integer; (* player triggering change *)
trigger_side: integer; (* side triggering change *)
trigger_page: longword; (* page triggering change *)
target_element: integer; (* target element after change *)
delay_fixed: integer; (* added frame delay before changed (fixed) *)
delay_random: integer; (* added frame delay before changed (random) *)
delay_frames: integer; (* either 1 (frames) or 50 (seconds; 50 fps) *)
trigger_element: integer; (* element triggering change *)
target_content: TContent; (* elements for extended change target *)
use_target_content: boolean; (* use extended change target *)
only_if_complete: boolean; (* only use complete target content *)
use_random_replace: boolean; (* use random value for replacing elements *)
random_percentage: integer; (* random value for replacing elements *)
replace_when: integer; (* type of elements that can be replaced *)
explode: boolean; (* explode instead of change *)
has_action: boolean; (* execute action on specified condition *)
action_type: integer; (* type of action *)
action_mode: integer; (* mode of action *)
action_arg: integer; (* parameter of action *)
(* ---------- internal values used at runtime when playing ---------- *)
(* functions that are called before, while and after the change of an
     element -- currently only used for non-custom elements *)
//pre_change_function: procedure(x: integer;  y: integer);
//change_function: procedure(x: integer;  y: integer);
//post_change_function: procedure(x: integer;  y: integer);
//actual_trigger_element: smallint; (* element that actually triggered change *)
//actual_trigger_side: integer; (* element side that triggered the change *)
//actual_trigger_player: integer; (* player which actually triggered change *)
//actual_trigger_ce_value: integer; (* CE value of element that triggered change *)
//actual_trigger_ce_score: integer; (* CE score of element that triggered change *)
//can_change_or_has_action: boolean; (* can_change | has_action *)
(* ---------- internal values used in level editor ---------- *)
//direct_action: integer; (* change triggered by actions on element *)
//other_action: integer; (* change triggered by other element actions *)
end;
pElementChangeInfo = ^ElementChangeInfo;
ElementGroupInfo = packed record
num_elements: integer; (* number of elements in this group *)
element: array [0..Pred(MAX_ELEMENTS_IN_GROUP)] of integer; (* list of elements in this group *)
choice_mode: integer; (* how to choose element from group *)
(* ---------- internal values used at runtime when playing ---------- *)
(* the following is the same as above, but with recursively resolved group
     elements (group elements may also contain further group elements!) *)
num_elements_resolved: integer;
element_resolved: array [0..Pred(NUM_FILE_ELEMENTS)] of smallint;
choice_pos: integer; (* current element choice position *)
end;
pElementGroupInfo = ^ElementGroupInfo;
ElementNameInfo = packed record
token_name: pchar; (* ---------- token and description strings ---------- *)
(* element token used in config files *)
class_name: pchar; (* element class used in config files *)
editor_description: pchar; (* pre-defined description for level editor *)
end;
pElementInfo = ^ElementInfo;
ElementInfo = packed record
token_name: pchar; (* ---------- token and description strings ---------- *)
(* element token used in config files *)
class_name: pchar; (* element class used in config files *)
editor_description: string; (* pre-defined description for level editor *)
custom_description: string; (* alternative description from config file *)
description: array [0..Pred(MAX_ELEMENT_NAME_LEN+1)] of char; (* for custom/group elements *)
//description: PChar; (* for custom/group elements *)// ***ZZZ***
(* ---------- graphic and sound definitions ---------- *)
//graphic: array [0..Pred(NUM_ACTIONS)] of integer; (* default graphics for several actions *)
//direction_graphic: array [0..Pred(NUM_ACTIONS),0..Pred(NUM_DIRECTIONS_FULL)] of integer; (* special graphics for left/right/up/down *)
//crumbled: array [0..Pred(NUM_ACTIONS)] of integer; (* crumbled graphics for several actions *)
//direction_crumbled: array [0..Pred(NUM_ACTIONS),0..Pred(NUM_DIRECTIONS_FULL)] of integer; (* crumbled graphics for left/right/up/down *)
//special_graphic: array [0..Pred(NUM_SPECIAL_GFX_ARGS)] of integer; (* special graphics for certain screens *)
//sound: array [0..Pred(NUM_ACTIONS)] of integer; (* default sounds for several actions *)
(* ---------- special element property values ---------- *)
properties: array [0..Pred(NUM_EP_BITFIELDS)] of Longword; (* element base properties *)
use_gfx_element: boolean; (* use custom graphic element *)
gfx_element: integer; (* optional custom graphic element *)
access_direction: integer; (* accessible from which direction *)
collect_score_initial: integer; (* initial score value for collecting *)
collect_count_initial: integer; (* initial count value for collecting *)
ce_value_fixed_initial: integer; (* initial value for custom variable (fix) *)
ce_value_random_initial: integer; (* initial value for custom variable (rnd) *)
use_last_ce_value: boolean; (* use value from element before change *)
push_delay_fixed: integer; (* constant delay before pushing *)
push_delay_random: integer; (* additional random delay before pushing *)
drop_delay_fixed: integer; (* constant delay after dropping *)
drop_delay_random: integer; (* additional random delay after dropping *)
move_delay_fixed: integer; (* constant delay after moving *)
move_delay_random: integer; (* additional random delay after moving *)
move_pattern: integer; (* direction movable element moves to *)
move_direction_initial: integer; (* initial direction element moves to *)
move_stepsize: integer; (* step size element moves with *)
move_enter_element: integer; (* element that can be entered (and removed) *)
move_leave_element: integer; (* element that can be left behind *)
move_leave_type: integer; (* change (limited) or leave (unlimited) *)
slippery_type: integer; (* how/where other elements slip away *)
content: TContent; (* new elements after explosion *)
explosion_type: integer; (* type of explosion, like 3x3, 3+3 or 1x1 *)
explosion_delay: integer; (* duration of explosion of this element *)
ignition_delay: integer; (* delay for explosion by other explosion *)
change_page: array [0..MAX_CHANGE_PAGES] of ElementChangeInfo; (* actual list of change pages *)
change: pElementChangeInfo; (* pointer to current change page *)
num_change_pages: shortint; (* actual number of change pages *)
current_change_page: integer; (* currently edited change page *)
group: pElementGroupInfo; (* pointer to element group info *)
(* ---------- internal values used at runtime when playing ---------- *)
has_change_event: array [0..Pred(NUM_CHANGE_EVENTS)] of boolean;
event_page_nr: array [0..Pred(NUM_CHANGE_EVENTS)] of integer; (* page number for each event *)
//event_page: array [0..Pred(NUM_CHANGE_EVENTS)] of pElementChangeInfo; (* page for event *)
//in_group: array [0..Pred(NUM_GROUP_ELEMENTS)] of boolean;
//collect_score: integer; (* runtime score value for collecting *)
(* ---------- internal values used in level editor ---------- *)
access_type: integer; (* walkable or passable *)
access_layer: integer; (* accessible over/inside/under *)
access_protected: integer; (* protection against deadly elements *)
walk_to_action: integer; (* diggable/collectible/pushable *)
smash_targets: integer; (* can smash player/enemies/everything *)
deadliness: integer; (* deadly when running/colliding/touching *)
can_explode_by_fire: boolean; (* element explodes by fire *)
can_explode_smashed: boolean; (* element explodes when smashed *)
can_explode_impact: boolean; (* element explodes on impact *)
modified_settings: boolean; (* set for all modified custom elements *)
end;
}
